#pragma once

#include <vex/iterable/range_tags.h>
#include <type_traits>

namespace vex { namespace iterable {
    template <class TRange>
    struct range_traits {
        typedef typename std::decay<TRange>::type range_type;
        typedef typename range_type::category category;
        typedef typename range_type::reference reference;
        typedef typename std::remove_const<
            typename std::remove_reference<reference>::type
        >::type value_type;
        typedef typename std::add_pointer<
            typename std::remove_reference<reference>::type
        >::type pointer;
    };
}}